home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Scene Storm
/
Scene Storm - Volume 1.iso
/
coding
/
asm
/
utils
/
textextract
/
textextract.s
Wrap
Text File
|
1980-01-03
|
15KB
|
551 lines
*******************************************************************************
* Scan_Diz Copyright © 1994 2-Cool/EX4!
* ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
* $Release : 0.1 $
* $Revision : 1.01 $
* $Date : 12-Jan-94 $
*
* $Author(s) : Written by 2-Cool/EX4! (In MC680x0 Assembly under Asm-One)
* $Note(s) : Position Independacy off a4 - (WARNING: DON`T TRASH A4!)
* : Execbase Ptr is cached so that if running in fastmem access
* : to execbase ptr is faster.
*
* $Purpose : For calculating the checksum of a file to see if its been
* : either corrupted or modified by some lamers like fish, etc.
* : trying to rip off your work...
*******************************************************************************
AbsExecBase = 4 /* Execbase Definition */
SUCCESS = 0 /* result return codes... */
VAR_ERROR = 1 /* memory alloction failcode */
CSI = $1b
CLS macro
dc.b CSI,'c',LF
endm
*-------------- Definition Includes...
incdir _include:
include exec/exec.i
include "include:exec/funcdef.i"
include intuition/intuition.i
include graphics/videocontrol.i
include libraries/asl.i
include libraries/gadtools.i
include libraries/dos_lib.i
include libraries/intuition_lib.i
include libraries/graphics_lib.i
include libraries/exec_lib.i
include libraries/asl_lib.i
include libraries/icon_lib.i
include libraries/diskfont_lib.i
include libraries/gadtools_lib.i
include libraries/wb_lib.i
include libraries/rexxsyslib_lib.i
include libraries/utility_lib.i
include libraries/dosextens.i
include utility/tagitem.i
include dos/datetime.i
include libraries/reqtools.i
*-------------- Definition of Main Variables (Public) Block...
STRUCTURE VarsBlock,0
APTR _ExecBase /* ExecBase base */
APTR _DOSBase /* DOS lib base */
APTR _DOSOutput /* DOS output base */
APTR _ArgPtr
APTR _ArgPtr2
ULONG _ArgLen
APTR ProgBuff /* ptr to progbuffer */
APTR ProgHandle /* ptr to filehandle */
ULONG ProgSize /* length file */
APTR DizStart
APTR DizEnd
APTR DizSize
LABEL vars_SIZEOF
*-------------- Definition of Macros...
PUSH macro
movem.l \1,-(sp)
endm
PULL macro
movem.l (sp)+,\1
endm
PUSHW macro
movem.w \1,-(sp)
endm
PULLW macro
movem.w (sp)+,\1
endm
PUSHR macro
move.l \1,-(sp)
endm
PULLR macro
move.l (sp)+,\1
endm
CALL macro
jsr _LVO\1(a6)
endm
CALLJ macro
jmp _LVO\1(a6)
endm
CALLREL macro
move.l \2(a4),a6
CALL \1
endm
*******************************************************************************
*-------------- Allocate our Variables (RS.) Area
ProgStart: move.l a0,a5
move.l d0,d5
move.l #vars_SIZEOF,d0 ;length for our variables
move.l #MEMF_PUBLIC+MEMF_CLEAR,d1 ;we want public mem, cleared
move.l (AbsExecBase).w,a6 ;get SysBase
CALL AllocMem ;allocate it...
move.l d0,a4 ;ptr to our RS.Variables base
bne.s RSValid ;did the alloc fail, if so exit
moveq #VAR_ERROR,d0 ;Memory allocation fail code
rts ;exit to dos...
*-------------- From here a4 points to our variables area (DON`T DESTROY A4!)
RSValid: move.l a6,(a4) ;cache execptr in Public so if
move.l a5,_ArgPtr(a4)
move.l d5,_ArgLen(a4)
sf.b -1(a5,d5.w) ;null terminate arg string..
*-------------- Open DOS Library
moveq #0,d0 ;set lib version
lea Dosname(pc),a1 ;lib name in a1
CALL OpenLibrary ;try to open library
move.l d0,_DOSBase(a4) ;store lib base
beq.w ShutDown ;cleanup and quit if fail
*-------------- Get DOS Output
move.l d0,a6 ;get dosbase
CALL Output ;get output base
move.l d0,_DOSOutput(a4) ;save outputbase
*-------------- Program starts here
lea About.Txt(pc),a0 ;format string
bsr.w OSPutStr
move.l _ArgPtr(a4),a0
move.b (a0)+,d0 ;we are in fastmem were faster
cmp.b #"e",d0
beq.s do_extract
cmp.b #"a",d0
beq.w no_adding
*-------------- check for extracting...
do_extract: cmp.b #"?",(a0)
bne.s no_usage
lea Args.Txt(pc),a0 ;format string
bsr.w OSPutStr
bra.w ShutDown
no_usage: tst.b (a0)+
move.l a0,a1
move.l _ArgLen(a4),d1
.findname: cmp.b #" ",(a1)+
beq.s found
subq.l #1,d1
bne.s .findname
lea Args.Txt(pc),a0 ;format string
bsr.w OSPutStr
bra.w ShutDown
found tst.b -(a1)
sf.b (a1)+
move.l a1,_ArgPtr2(a4)
bsr.w LoadDOSFile
cmp.b #-2,d0
beq.w LoadFailedMem ;load 'express failed'
cmp.b #-1,d0
beq.w LoadNotFound
lea Scan.txt(pc),a0 ;format string
bsr.w OSPutStr
*-------------- Search for Diz Start
move.l ProgBuff(a4),a0 ;start adr
move.l a0,a1
add.l ProgSize(a4),a1 ;end adr
lea StartDiz.txt(pc),a2 ;string to find
bsr.w FindString
bne.w StartDiz_Error
lea 18(a0),a0 ;skip header
move.l a0,DizStart(a4) ;start of description found?
*-------------- Search for Diz End
lea EndDiz.txt(pc),a2
bsr.w FindString
bne.w EndDiz_Error
move.l a0,DizEnd(a4) ;end of description found?
sub.l DizStart(a4),a0
move.l a0,DizSize(a4)
cmp.l #512,a0 ;description over 1k??
beq.w DizSize_TooBig
*-------------- Copy File_ID Diz to destination buffer
move.l a0,d0
move.l DizStart(a4),a1 ;memadr
move.l _ArgPtr2(a4),a0
*-------------- Program ends here
*-------------- d0=length
* a0=filename
* a1=mem adr
bsr SaveMem2File
cmp.b #1,d0 ;d0.l = result-code..
beq.w SaveError
lea FoundDiz.txt(pc),a0 ;format string
bsr.w OSPutStr
move.l DizStart(a4),a0 ;memadr
move.l DizSize(a4),d0
sf.b (a0,d0.w)
bsr.w OSPutStr
lea Done.txt(pc),a0 ;format string
bsr.w OSPutStr
*******************************************************************************
* Shutdown() - Free all allocated resources & exit program
* ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
* Frees all previously allocated resources, sanity checks are made so only
* allocated memory/open libraries will be removed.
*******************************************************************************
*-------------- Free DOS Library
ShutDown: bsr FreeDOSFile
move.l _DOSBase(a4),d0 ;dos lib base in a1
beq.s RSFreeMem
move.l d0,a1
CALL CloseLibrary ;close intuition
clr.l _DOSBase(a4) ;clear out base
*-------------- Free RS Variables Area
RSFreeMem: move.l a4,a1 ;ptr to our RS.Variables base
move.l #vars_SIZEOF,d0 ;no. of bytes to free
move.l (a4),a6 ;get execbase
CALL FreeMem ;free the memory
moveq #SUCCESS,d0 ;no return code
rts ;exit...
*******************************************************************************
* OSPutStr
* ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
* Sends a ascii text string to current console output
*
* $Inputs: a0.l = String ptr (null terminated)
*******************************************************************************
OSPutStr: move.l a0,d2
moveq #-1,d3 ;d4=0
.getlen2 addq.l #1,d3 ;increase string length by 1
tst.b (a0)+ ;increase position
bne.s .getlen2 ;nope not found, so keep on
move.l _DOSOutput(a4),d1
move.l _DOSBase(a4),a6
jmp _LVOWrite(a6) ;print error msg to cli
*******************************************************************************
* _LoadDOSFile :- Loads an AmigaDOS file from any device into memory
* ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
* INPUTS: a0 (.L) = Filename
*
* OUTPUTS: d0 (.L) = Result Code (0=File Ok,-1=Load Failed!)
* d1 (.L) = Length
*******************************************************************************
LoadDOSFile: movem.l d2-d7/a0-a6,-(sp)
clr.l ProgHandle(a4)
clr.l ProgBuff(a4)
clr.l ProgSize(a4)
;-------------- Open file
move.l a0,d1 ;get filename
move.l #MODE_OLDFILE,d2
move.l _DOSBase(a4),a6
jsr _LVOOpen(a6) ;open file
move.l d0,ProgHandle(a4)
beq.s NotFound
;-------------- Get Length of file
move.l d0,d5 ;ProgHandle
move.l d5,d1 ;file handle
moveq #0,d2
moveq #1,d3
move.l _DOSBase(a4),a6
jsr _LVOSeek(a6) ;seek start of file
move.l d5,d1 ;file handle
moveq #0,d2
moveq #-1,d3
jsr _LVOSeek(a6) ;seek end of file
move.l d0,ProgSize(a4)
;-------------- Allocate Memory for file
move.l 4.w,a6 ;get execbase
move.l #MEMF_PUBLIC,d1 ;we want public mem
CALL AllocMem ;allocate it...
move.l d0,ProgBuff(a4) ;save base
beq.b TooBig ;fail?
;-------------- Load in whole file
move.l ProgHandle(a4),d1
move.l d0,d2
move.l ProgSize(a4),d3
move.l _DOSBase(a4),a6
jsr _LVORead(a6) ;read file
;-------------- Close file
CloseFile: move.l ProgHandle(a4),d1
jsr _LVOClose(a6) ;close file
move.l ProgSize(a4),d1 ;d1=ProgSize
move.l ProgBuff(a4),a1
movem.l (sp)+,d2-d7/a0-a6
moveq #0,d0 ;resultcode (okay)
rts
NotFound: movem.l (sp)+,d2-d7/a0-a6
move.b #-1,d0 ;file not found error-code
rts
TooBig:
move.l ProgHandle(a4),d1
move.l _DOSBase(a4),a6
jsr _LVOClose(a6) ;close file
movem.l (sp)+,d2-d7/a0-a6
move.b #-2,d0 ;file too big error-code
NotAlloc rts
;-------------- Free Memory for DOSFile
FreeDOSFile: move.l (AbsExecBase).w,a6 ;get execbase
move.l ProgBuff(a4),d0 ;ptr to our RS.Variables base
move.l d0,a1
beq.s NotAlloc
move.l ProgSize(a4),d0 ;no. of Bytes to free
beq.s NotAlloc
jmp _LVOFreeMem(a6) ;free the memory
*******************************************************************************
* SaveMem2File
* ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
* $Inputs: a0.l = Filename
* a1.l = Mem Address
* d0.l = Save Length
*
* $Outputs: d0.l = 0 - success
* d0.l = 1 - failure
*******************************************************************************
SaveMem2File: movem.l d2-d7/a0-a6,-(sp)
move.l a0,d1 ;filename
move.l a1,d5 ;progbuffer
move.l d0,d6 ;proglength
move.l #MODE_NEWFILE,d2
move.l _DOSBase(a4),a6
jsr _LVOOpen(a6)
move.l d0,d7
beq.b _SaveError
move.l d7,d1 ;fh...
move.l d5,d2 ;adr
move.l d6,d3 ;length
jsr _LVOWrite(a6) ;write file
move.l d7,d1
jsr _LVOClose(a6) ;close file
movem.l (sp)+,d2-d7/a0-a6
moveq #0,d0
rts
_SaveError: movem.l (sp)+,d2-d7/a0-a6
remcode moveq #1,d0
rts
LoadFailedMem lea ErrorMem.txt(pc),a0
bra.s OSPut
LoadNotFound lea ErrorLoad.txt(pc),a0
bra.s OSPut
EndDiz_Error:
StartDiz_Error:
DizSize_TooBig
NoDiz: lea NoDiz.txt(pc),a0
bra.s OSPut
no_adding: lea NoAdd.txt(pc),a0
bra.s OSPut
SaveError lea ErrorSave.txt(pc),a0
OSPut bsr.w OSPutStr
bra ShutDown
*******************************************************************************
* FindString
* ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
* This routine will scan through Memory for a ascii (case dependant) string.
* The routine will not find its 'search string' if the start and end addresses
* are within the same address range as an added precaution.
*
* INPUTS ; a0.l=start address for search
* a1.l=end address for search
* a2.l=string to search for
*
* OUTPUTS; d0.b=If failed to located string =$FF.B, else =$00.B FOUND!
* a0.l=ptr to string
*******************************************************************************
FindString: movem.l a1-a6,-(sp)
subq.l #4,a0
bsr.s Search
movem.l (sp)+,a1-a6
rts
cmp4bytesd2: macro
cmp.b (a0)+,d2 ;do these 4 bytes match source?
beq.s \1
cmp.b (a0)+,d2 ;do these 4 bytes match source?
beq.s \1
cmp.b (a0)+,d2 ;do these 4 bytes match source?
beq.s \1
cmp.b (a0)+,d2 ;do these 4 bytes match source?
beq.s \1
endm
cmp32bytes macro
cmp4bytesd2 .yup
cmp4bytesd2 .yup
cmp4bytesd2 .yup
cmp4bytesd2 .yup
cmp4bytesd2 .yup
cmp4bytesd2 .yup
cmp4bytesd2 .yup
cmp4bytesd2 .yup
bra.s \1
.yup: move.l d4,d3
.cmp: cmpm.b (a2)+,(a0)+
dbne d3,.cmp
bne.w _Not_It
sub.l d6,a0
rts
endm
Search: move.l a2,a3
moveq #-3,d4 ;d4=0
.getlen addq.l #1,d4 ;increase string length by 1
tst.b (a2)+ ;increase position
bne.s .getlen ;nope not found, so keep on
move.l a3,a2
move.l d4,d6
addq.l #2,d6
moveq #0,d5 ;d5=0
move.b (a2)+,d2
_Not_It move.l a3,a2 ;a3=search string ptr
tst.b (a0)+ ;incr search pos
tst.b (a2)+
_contt lea -512(a1),a4 ;>512 bytes left to search?
cmp.l a4,a0
blt.s fastcmp ;if so do a 512 byte search...
_cmpcontt cmp.b (a0)+,d2 ;does this byte match string byte?
beq.s _nbyte ;yes!,lets investigate more...
cmp.l a1,a0 ;end of Memory region reached?
blt.s _cmpcontt ;yes,so string wasn`t found!
st d0 ;d0=not found!
rts
_nbyte: move.l d4,d3
_nloop: cmpm.b (a2)+,(a0)+
dbne d3,_nloop
bne.s _Not_It
sub.l d6,a0
rts
fastcmp cmp32bytes _1 ;test 512 Bytes FAAAAST
_1 cmp32bytes _2
_2 cmp32bytes _3
_3 cmp32bytes _4
_4 cmp32bytes _5
_5 cmp32bytes _6
_6 cmp32bytes _7
_7 cmp32bytes _8
_8 cmp32bytes _9
_9 cmp32bytes _10
_10 cmp32bytes _11
_11 cmp32bytes _12
_12 cmp32bytes _13
_13 cmp32bytes _14
_14 cmp32bytes _15
_15 cmp32bytes _16
_16 cmp.l a4,a0
blt.w fastcmp
bra.w _cmpcontt
StartDiz.txt: dc.b "@BEGIN_FILE_ID.DIZ",0
even
EndDiz.txt: dc.b "@END_FILE_ID.DIZ",0
even
******************************************************************************
* String & Data Variable definitions
Dosname: dc.b 'dos.library',0 ;dos lib name
even
ErrorAlloc.txt dc.b $a,'Error: Out of Memory!',$a,0
even
ErrorMem.txt dc.b $a,'Error: Not enough memory to load file!',$a,0
even
ErrorLoad.txt dc.b $a,'Error: Cannot open file!',$a,$a,0
even
ErrorSave.txt dc.b $a,'Error: Cannot save file!',$a,$a,0
even
Scan.txt: dc.b 'Scanning for file_id in file...',$a,$a,0
even
NoAdd.txt: dc.b 'Sorry, Adding of "FILE.ID_DIZ" not yet supported!',$a,$a,0
even
FoundDiz.txt: dc.b 'Found a file_id in file, viewing;',$a,$a,0
even
NoDiz.txt: dc.b $a,'Sorry, this textfile does not contain a vaild "file_id.diz" description!',$a,$a,0
even
Done.txt: dc.b $a,$a,'Operation Successful!',$a,$a,0
even
About.Txt: CLS ; clear screen
dc.b CSI,'[0m',CSI,'[1mTXTExtract v0.1',CSI,'[0m ',CSI,'[33m(Turbo Version) ',CSI,'[0m',CSI,'[3mBy 2-Cool/EX4!',LF
dc.b CSI,'[0mCopyright EX4 © 1993-94. All Rights Are Reserved.',LF
dc.b 'Last Assembled: 18-Oct-94.',LF
dc.b $a
dc.b 0
even
Args.Txt: dc.b 'Usage : ',CSI,'[32mTXTExtract ',CSI,'[31m<opt> <src> <dest>',LF
dc.b 'Example : ',CSI,'[32mTXTExtract ',CSI,'[31me lsd-suxx.txt bbs:file_id.diz',LF,LF
dc.b ' : Where <opt> is <e>xtract description.',LF
dc.b ' : or <a>dd description.',LF,LF
dc.b 0